#include <ctype.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <locale.h>
#include "tajk_lib.h"

void tajk_exportmsg(stru_tajk * tajk,int retcode,const char *retmsg){//必须要定义一个这样的函数，可以用来输出错误日志
    printf("%d|%s|\n",retcode,retmsg);
}

stru_tajk *tajk,*taidx;

int print(const char *fmt,...){//适应locale的printf
    char s[10240];
    wchar_t ws[20000];
    va_list ap;
    va_start(ap,fmt);
    vsnprintf(s,sizeof(s),fmt,ap);
    va_end(ap);
    setlocale(LC_ALL, "zh_CN.utf8");
    mbstowcs(ws,s,sizeof(ws));
    setlocale(LC_ALL,"");
    return printf("%ls",ws);
}

void writeidx(){//写索引文件
    print("测试写索引文件");
    taidx=tajk_init();
    tajk_setmode(taidx,1,21,"OFI","xxx","yy","20210118");//设置模式，1表示是索引文件，21表示2.1版本，OFI是索引文件标记， xxx用发送方代码替代，yy用接收方代码替代，最后一个参数是日期
    tajk_writebegin(taidx,".",0,NULL);//开始写文件头，不指定文件名，会自动生成文件名
    print("文件名:%s\n",taidx->fname);
    tajk_writeidx(taidx,"01",0);//在索引文件里插入数据文件，如果是2.2版本，还可以加上参数表示多个数据文件的批次
//    tajk_writeidx(taidx,"03",0);
    tajk_writeend(taidx);//结束写入
    tajk_free(taidx);
}

void writedata(){//写数据文件示例，以01文件为例
    char data[100][200];//用于字符类型字段的绑定
    double ndata[100];//用于数据类型字段的绑定
    short ind[100];//用于数字字段绑定时写入空白用
    print("测试写数据文件");
    tajk=tajk_init();
    tajk_setmode(tajk,0,21,"01","xxx","yy","20210118");
    tajk_writebegin(tajk,".",0,NULL);
    print("文件名:%s\n",tajk->fname);
    for(int i=0;i<tajk->fieldnum;i++){
        if(tajk->sd[i].type!='N'){//字符类型字段
            tajk_bindc(tajk,tajk->sd[i].name,data[i]);//把字段和具体变量绑定，在写入时会自动把变量的数据写到数据文件一行中的指定位置
            strcpy(data[i],tajk->sd[i].name);//对变量赋值
        }else{
            tajk_bindd(tajk,tajk->sd[i].name,&ndata[i],0,&ind[i]);//绑定数字型字段，设置默认值为0(写入时默认值无意义），设置指示变量为ind[i]
            ind[i]=0;//指示变量非零，把这个字段置为空格，表示空值。为0，才会把变量的值写入字段中
            ndata[i]=i;//对变量赋值
        };
    };
    tajk_writedata(tajk);
    tajk_writeend(tajk);
    tajk_free(tajk);
}

void readdata(char * fmode,int batchnum){//测试读数据文件
    char data[100][200];//用于字符类型字段的绑定
    double ndata[100];//用于数据类型字段的绑定
    short ind[100];//用于数字字段绑定时写入空白用
    int maxcolsize=0;
    tajk=tajk_init();
    if(tajk_readfile2(tajk,0,".",fmode,"xxx","yy","20210118",batchnum)!=0)return;
    print("%s文件字段数%d 记录数%d\n",fmode,tajk->fieldnum,tajk->totalrecord);
    for(int i=0;i<tajk->fieldnum;i++){
        if((int)strlen(tajk->sd[i].name)>maxcolsize)maxcolsize=strlen(tajk->sd[i].name);
        if(tajk->sd[i].type!='N'){//字符类型字段
            tajk_bind(tajk,tajk->sd[i].name,data[i],NULL);//把字段和具体变量绑定
        }else{
            tajk_bind(tajk,tajk->sd[i].name,&ndata[i],&ind[i]);//绑定数字型字段，设置默认值为0(写入时默认值无意义），设置指示变量为ind[i]
        };
    };
    for(int j=0;j<tajk->totalrecord;j++){
        tajk_readdata(tajk);
        print("读入第%d行\n",j+1);
        for(int i=0;i<tajk->fieldnum;i++){
            if(tajk->sd[i].type!='N'){//字符类型字段
                print("%*s  %s\n",maxcolsize,tajk->sd[i].name,data[i]);
            }else{
                print("%*s  %lf\n",maxcolsize,tajk->sd[i].name,ndata[i]);
            };
        };
    };
    tajk_free(tajk);
}

void readidx(){//测试读索引文件
    char fname[1024],fmode[20];
    int batchnum;
    print("测试读索引文件");
    taidx=tajk_init();
    tajk_readfile2(taidx,1,".","OFI","xxx","yy","20210118",0);
    for(int i=0;i<taidx->totalrecord;i++){
        tajk_readidx(taidx,fname,fmode,&batchnum);
        print("索引第%d条：文件名%s，文件类型%s，批次号%d\n",i+1,fname,fmode,batchnum);
        readdata(fmode,batchnum);
    };
    tajk_free(taidx);
}

int main(int argc,char **argv){
    writeidx();
    writedata();
    readidx();
	return 0;
}
